#!/bin/bash
#From https://github.com/oneclickvirt/ecs
#2024.07.21

# curl -L https://raw.githubusercontent.com/oneclickvirt/ecs/master/goecs.sh -o goecs.sh && chmod +x goecs.sh

cat <<"EOF"
       GGGGGGGG        OOOOOOO         EEEEEEEE      CCCCCCCCC    SSSSSSSSSS
     GG        GG    OO       OO      EE           CC           SS
    GG              OO         OO     EE          CC           SS
    GG              OO         OO     EE          CC            SS
    GG              OO         OO     EEEEEEEE    CC             SSSSSSSSSS
    GG     GGGGGG   OO         OO     EE          CC                      SS
    GG        GG    OO         OO     EE          CC                       SS
     GG      GG      OO       OO      EE           CC                     SS
      GGGGGGGG         OOOOOOO         EEEEEEEE     CCCCCCCCC    SSSSSSSSSS
EOF

cd /root >/dev/null 2>&1
if [ ! -d "/usr/bin/" ]; then
    mkdir -p "/usr/bin/"
fi
_red() { echo -e "\033[31m\033[01m$@\033[0m"; }
_green() { echo -e "\033[32m\033[01m$@\033[0m"; }
_yellow() { echo -e "\033[33m\033[01m$@\033[0m"; }
_blue() { echo -e "\033[36m\033[01m$@\033[0m"; }

check_cdn() {
    local o_url=$1
    for cdn_url in "${cdn_urls[@]}"; do
        if curl -sL -k "$cdn_url$o_url" --max-time 6 | grep -q "success" >/dev/null 2>&1; then
            export cdn_success_url="$cdn_url"
            return
        fi
        sleep 0.5
    done
    export cdn_success_url=""
}

check_cdn_file() {
    check_cdn "https://raw.githubusercontent.com/spiritLHLS/ecs/main/back/test"
    if [ -n "$cdn_success_url" ]; then
        _green "CDN available, using CDN"
    else
        _yellow "No CDN available, no use CDN"
    fi
}

download_file() {
    local url="$1"
    local output="$2"
    if ! wget -O "$output" "$url"; then
        _yellow "wget failed, trying curl..."
        if ! curl -L -o "$output" "$url"; then
            _red "Both wget and curl failed. Unable to download the file."
            return 1
        fi
    fi
    return 0
}

goecs_check() {
    os=$(uname -s)
    arch=$(uname -m)
    ECS_VERSION=$(curl -m 6 -sSL "https://api.github.com/repos/oneclickvirt/ecs/releases/latest" | awk -F \" '/tag_name/{gsub(/^v/,"",$4); print $4}')
    # 如果 https://api.github.com/ 请求失败，则使用 https://githubapi.spiritlhl.workers.dev/ ，此时可能宿主机无IPV4网络
    if [ -z "$ECS_VERSION" ]; then
        ECS_VERSION=$(curl -m 6 -sSL "https://githubapi.spiritlhl.workers.dev/repos/oneclickvirt/ecs/releases/latest" | awk -F \" '/tag_name/{gsub(/^v/,"",$4); print $4}')
    fi
    # 如果 https://githubapi.spiritlhl.workers.dev/ 请求失败，则使用 https://githubapi.spiritlhl.top/ ，此时可能宿主机在国内
    if [ -z "$ECS_VERSION" ]; then
        ECS_VERSION=$(curl -m 6 -sSL "https://githubapi.spiritlhl.top/repos/oneclickvirt/ecs/releases/latest" | awk -F \" '/tag_name/{gsub(/^v/,"",$4); print $4}')
    fi
    # 检测原始goecs命令是否存在，若存在则升级，不存在则安装
    version_output=$(goecs -v command 2>/dev/null || ./goecs -v command 2>/dev/null)
    if [ $? -eq 0 ]; then
        extracted_version=${version_output//v/}
        if [ -n "$extracted_version" ]; then
            ecs_version=$ECS_VERSION
            if [[ "$(echo -e "$extracted_version\n$ecs_version" | sort -V | tail -n 1)" == "$extracted_version" ]]; then
                _green "goecs version ($extracted_version) is latest, no need to upgrade."
                return
            else
                _yellow "goecs version ($extracted_version) < $ecs_version, need to upgrade, 5 seconds later will start to upgrade"
                rm -rf /usr/bin/goecs
                rm -rf goecs
            fi
        fi
    else
        _green "Can not find goecs, need to download and install, 5 seconds later will start to install"
    fi
    sleep 5
    cdn_urls=("https://cdn0.spiritlhl.top/" "http://cdn3.spiritlhl.net/" "http://cdn1.spiritlhl.net/" "http://cdn2.spiritlhl.net/")
    check_cdn_file
    case $os in
        Linux)
            case $arch in
            "x86_64" | "x86" | "amd64" | "x64")
                download_file "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/goecs_linux_amd64.zip" "goecs.zip"
                ;;
            "i386" | "i686")
                download_file "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/goecs_linux_386.zip" "goecs.zip"
                ;;
            "armv7l" | "armv8" | "armv8l" | "aarch64" | "arm64")
                download_file "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/goecs_linux_arm64.zip" "goecs.zip"
                ;;
            "mips")
                download_file "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/goecs_linux_mips.zip" "goecs.zip"
                ;;
            "mipsle")
                download_file "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/goecs_linux_mipsle.zip" "goecs.zip"
                ;;
            "s390x")
                download_file "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/goecs_linux_s390x.zip" "goecs.zip"
                ;;
            "riscv64")
                download_file "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/goecs_linux_riscv64.zip" "goecs.zip"
                ;;
            *)
                _red "Unsupported architecture: $arch , please check https://github.com/oneclickvirt/ecs/releases to download the zip for yourself and unzip it to use the binary for testing."
                exit 1
                ;;
            esac
            ;;
        FreeBSD)
            case $arch in
            "x86_64" | "x86" | "amd64" | "x64")
                download_file "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/goecs_freebsd_amd64.zip" "goecs.zip"
                ;;
            "i386" | "i686")
                download_file "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/goecs_freebsd_386.zip" "goecs.zip"
                ;;
            "armv7l" | "armv8" | "armv8l" | "aarch64" | "arm64")
                download_file "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/goecs_freebsd_arm64.zip" "goecs.zip"
                ;;
            *)
                _red "Unsupported architecture: $arch , please check https://github.com/oneclickvirt/ecs/releases to download the zip for yourself and unzip it to use the binary for testing."
                exit 1
                ;;
            esac
            ;;
        Darwin)
            case $arch in
            "x86_64" | "x86" | "amd64" | "x64")
                download_file "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/goecs_amd64.zip" "goecs.zip"
                ;;
            "armv7l" | "armv8" | "armv8l" | "aarch64" | "arm64")
                download_file "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/goecs_arm64.zip" "goecs.zip"
                ;;
            *)
                _red "Unsupported architecture: $arch , please check https://github.com/oneclickvirt/ecs/releases to download the zip for yourself and unzip it to use the binary for testing."
                exit 1
                ;;
            esac
            ;;
        *)
            _red "Unsupported operating system: $os , please check https://github.com/oneclickvirt/ecs/releases to download the zip for yourself and unzip it to use the binary for testing."
            exit 1
            ;;
    esac
    unzip goecs.zip
    rm -rf goecs.zip
    rm -rf README.md
    rm -rf LICENSE
    sleep 1
    chmod 777 goecs
    rm -rf /usr/bin/goecs
    sleep 1
    cp goecs /usr/bin/goecs
    rm -rf README_EN.md
    rm -rf README.md
    PARAM="net.ipv4.ping_group_range"
    NEW_VALUE="0 2147483647"
    CURRENT_VALUE=$(sysctl -n "$PARAM" 2>/dev/null)
    if [ -f /etc/sysctl.conf ] && [ "$CURRENT_VALUE" != "$NEW_VALUE" ]; then
        if grep -q "^$PARAM" /etc/sysctl.conf; then
            sudo sed -i "s/^$PARAM.*/$PARAM = $NEW_VALUE/" /etc/sysctl.conf
        else
            echo "$PARAM = $NEW_VALUE" | sudo tee -a /etc/sysctl.conf
        fi
        sudo sysctl -p
    fi
    setcap cap_net_raw=+ep goecs
    setcap cap_net_raw=+ep /usr/bin/goecs
    echo "goecs version:"
    goecs -v || ./goecs -v
}

InstallSysbench() {
    if [ -f "/etc/centos-release" ]; then # CentOS
        Var_OSRelease="centos"
    elif [ -f "/etc/fedora-release" ]; then # Fedora
        Var_OSRelease="fedora"
    elif [ -f "/etc/redhat-release" ]; then # RedHat
        Var_OSRelease="rhel"
    elif [ -f "/etc/astra_version" ]; then # Astra
        Var_OSRelease="astra"
    elif [ -f "/etc/lsb-release" ]; then # Ubuntu
        Var_OSRelease="ubuntu"
    elif [ -f "/etc/debian_version" ]; then # Debian
        Var_OSRelease="debian"
    elif [ -f "/etc/alpine-release" ]; then # Alpine Linux
        Var_OSRelease="alpinelinux"
    elif [ -f "/etc/almalinux-release" ]; then # almalinux
        Var_OSRelease="almalinux"
    # rockylinux
    elif [ -f "/etc/arch-release" ]; then # archlinux
        Var_OSRelease="arch"
    elif [ -f "/etc/freebsd-update.conf" ]; then # freebsd
        Var_OSRelease="freebsd"
    else
        Var_OSRelease="unknown" # 未知系统分支
    fi
    case "$Var_OSRelease" in
    ubuntu | debian | astra) ! apt-get install -y sysbench && apt-get --fix-broken install -y && apt-get install --no-install-recommends -y sysbench ;;
    centos | rhel | almalinux | redhat) (yum -y install epel-release && yum -y install sysbench) || (dnf install epel-release -y && dnf install sysbench -y) ;;
    fedora) dnf -y install sysbench ;;
    arch) pacman -S --needed --noconfirm sysbench && pacman -S --needed --noconfirm libaio && ldconfig ;;
    freebsd) pkg install -y sysbench ;;
    alpinelinux) echo -e "${Msg_Warning}Sysbench Module not found, installing ..." && echo -e "${Msg_Warning}SysBench Current not support Alpine Linux, Skipping..." && Var_Skip_SysBench="1" ;;
    *) _red "Sysbench Install Error: Unknown OS release: $os_release" ;;
    esac
}

Check_SysBench() {
    if [ ! -f "/usr/bin/sysbench" ] && [ ! -f "/usr/local/bin/sysbench" ]; then
        InstallSysbench
    fi
    # 尝试编译安装
    if [ ! -f "/usr/bin/sysbench" ] && [ ! -f "/usr/local/bin/sysbench" ]; then
        echo -e "${Msg_Warning}Sysbench Module install Failure, trying compile modules ..."
        Check_Sysbench_InstantBuild
    fi
    source ~/.bashrc
    # 最终检测
    if [ "$(command -v sysbench)" ] || [ -f "/usr/bin/sysbench" ] || [ -f "/usr/local/bin/sysbench" ]; then
        _yellow "Install sysbench successfully!"
    else
        _red "SysBench Moudle install Failure! Try Restart Bench or Manually install it! (/usr/bin/sysbench)"
        _blue "Will try to test with geekbench5 instead later."
    fi
    sleep 3
}

Check_Sysbench_InstantBuild() {
    if [ "${Var_OSRelease}" = "centos" ] || [ "${Var_OSRelease}" = "rhel" ] || [ "${Var_OSRelease}" = "almalinux" ] || [ "${Var_OSRelease}" = "ubuntu" ] || [ "${Var_OSRelease}" = "debian" ] || [ "${Var_OSRelease}" = "fedora" ] || [ "${Var_OSRelease}" = "arch" ] || [ "${Var_OSRelease}" = "astra" ]; then
        local os_sysbench=${Var_OSRelease}
        if [ "$os_sysbench" = "astra" ]; then
            os_sysbench="debian"
        fi
        echo -e "${Msg_Info}Release Detected: ${os_sysbench}"
        echo -e "${Msg_Info}Preparing compile enviorment ..."
        prepare_compile_env "${os_sysbench}"
        echo -e "${Msg_Info}Downloading Source code (Version 1.0.20)..."
        mkdir -p /tmp/sysbench_install/src/
        mv /tmp/sysbench-1.0.20 /tmp/sysbench_install/src/
        echo -e "${Msg_Info}Compiling Sysbench Module ..."
        cd /tmp/sysbench_install/src/sysbench-1.0.20
        ./autogen.sh && ./configure --without-mysql && make -j8 && make install
        echo -e "${Msg_Info}Cleaning up ..."
        cd /tmp && rm -rf /tmp/sysbench_install/src/sysbench*
    else
        echo -e "${Msg_Warning}Unsupported operating system: ${Var_OSRelease}"
    fi
}

prepare_compile_env() {
    local system="$1"
    if [ "${system}" = "centos" ] || [ "${system}" = "rhel" ] || [ "${system}" = "almalinux" ]; then
        yum install -y epel-release
        yum install -y wget curl make gcc gcc-c++ make automake libtool pkgconfig libaio-devel
    elif [ "${system}" = "ubuntu" ] || [ "${system}" = "debian" ]; then
        ! apt-get update && apt-get --fix-broken install -y && apt-get update
        ! apt-get -y install --no-install-recommends curl wget make automake libtool pkg-config libaio-dev unzip && apt-get --fix-broken install -y && apt-get -y install --no-install-recommends curl wget make automake libtool pkg-config libaio-dev unzip
    elif [ "${system}" = "fedora" ]; then
        dnf install -y wget curl gcc gcc-c++ make automake libtool pkgconfig libaio-devel
    elif [ "${system}" = "arch" ]; then
        pacman -S --needed --noconfirm wget curl gcc gcc make automake libtool pkgconfig libaio lib32-libaio
    else
        echo -e "${Msg_Warning}Unsupported operating system: ${system}"
    fi
}

env_check() {
    REGEX=("debian|astra" "ubuntu" "centos|red hat|kernel|oracle linux|alma|rocky" "'amazon linux'" "fedora" "arch" "freebsd" "alpine" "openbsd")
    RELEASE=("Debian" "Ubuntu" "CentOS" "CentOS" "Fedora" "Arch" "FreeBSD" "Alpine" "OpenBSD")
    PACKAGE_UPDATE=("apt-get update" "apt-get update" "yum -y update" "yum -y update" "yum -y update" "pacman -Sy" "pkg update" "apk update" "pkg_add -u")
    PACKAGE_INSTALL=("apt-get -y install" "apt-get -y install" "yum -y install" "yum -y install" "yum -y install" "pacman -Sy --noconfirm --needed" "pkg install -y" "apk add")
    PACKAGE_REMOVE=("apt-get -y remove" "apt-get -y remove" "yum -y remove" "yum -y remove" "yum -y remove" "pacman -Rsc --noconfirm" "pkg delete" "apk del")
    PACKAGE_UNINSTALL=("apt-get -y autoremove" "apt-get -y autoremove" "yum -y autoremove" "yum -y autoremove" "yum -y autoremove" "" "pkg autoremove" "apk autoremove")
    # 检查系统信息
    if [ -f /etc/alpine-release ]; then
        SYS="alpine"
    elif [ -s /etc/os-release ]; then
        SYS="$(grep -i pretty_name /etc/os-release | cut -d \" -f2)"
    elif [ -x "$(type -p hostnamectl)" ]; then
        SYS="$(hostnamectl | grep -i system | cut -d : -f2 | xargs)"
    elif [ -x "$(type -p lsb_release)" ]; then
        SYS="$(lsb_release -sd)"
    elif [ -s /etc/lsb-release ]; then
        SYS="$(grep -i description /etc/lsb-release | cut -d \" -f2)"
    elif [ -s /etc/redhat-release ]; then
        SYS="$(grep . /etc/redhat-release)"
    elif [ -s /etc/issue ]; then
        SYS="$(grep . /etc/issue | cut -d '\' -f1 | sed '/^[ ]*$/d')"
    else
        SYS="$(uname -s)"
    fi
    [[ -n $SYS ]] || exit 1
    # 匹配操作系统
    for ((int = 0; int < ${#REGEX[@]}; int++)); do
        if [[ $(echo "$SYS" | tr '[:upper:]' '[:lower:]') =~ ${REGEX[int]} ]]; then
            SYSTEM="${RELEASE[int]}"
            [[ -n $SYSTEM ]] && break
        fi
    done
    # 检查是否成功匹配
    [[ -n $SYSTEM ]] || exit 1
    # 根据 SYSTEM 设置相应的包管理命令
    UPDATE_CMD=${PACKAGE_UPDATE[int]}
    INSTALL_CMD=${PACKAGE_INSTALL[int]}
    REMOVE_CMD=${PACKAGE_REMOVE[int]}
    UNINSTALL_CMD=${PACKAGE_UNINSTALL[int]}
    echo "System: $SYSTEM"
    echo "Update command: $UPDATE_CMD"
    echo "Install command: $INSTALL_CMD"
    echo "Remove command: $REMOVE_CMD"
    echo "Uninstall command: $UNINSTALL_CMD"
    cdn_urls=("https://cdn0.spiritlhl.top/" "http://cdn3.spiritlhl.net/" "http://cdn1.spiritlhl.net/" "http://cdn2.spiritlhl.net/")
    check_cdn_file
    _green "Update system manager."
    ${PACKAGE_UPDATE[int]} 2>/dev/null
    if ! command -v sudo >/dev/null 2>&1; then
        _green "Installing sudo"
        ${PACKAGE_INSTALL[int]} sudo
    fi
    if ! command -v wget >/dev/null 2>&1; then
        _green "Installing wget"
        ${PACKAGE_INSTALL[int]} wget
    fi
    if ! command -v tar >/dev/null 2>&1; then
        _green "Installing tar"
        ${PACKAGE_INSTALL[int]} tar
    fi
    if ! command -v unzip >/dev/null 2>&1; then
        _green "Installing unzip"
        ${PACKAGE_INSTALL[int]} unzip
    fi
    if ! command -v systemd-detect-virt >/dev/null 2>&1; then
        _green "Installing systemd-detect-virt"
        ${PACKAGE_INSTALL[int]} systemd-detect-virt
        if [ $? -ne 0 ]; then
            if ! command -v dmidecode >/dev/null 2>&1; then
                _green "Installing dmidecode"
                ${PACKAGE_INSTALL[int]} dmidecode
            fi
        fi
    fi
    if ! command -v dd >/dev/null 2>&1; then
        _green "Installing dd"
        ${PACKAGE_INSTALL[int]} coreutils
        if [ $? -ne 0 ]; then
          ${PACKAGE_INSTALL[int]} man
        fi
    fi
    if ! command -v fio >/dev/null 2>&1; then
        _green "Installing fio"
        ${PACKAGE_INSTALL[int]} fio
    fi
    if ! command -v sysbench >/dev/null 2>&1 && [ "${REGEX[int]}" != "freebsd" ]; then
        _green "Installing sysbench"
        ${PACKAGE_INSTALL[int]} sysbench
        if [ $? -ne 0 ]; then
            echo "Unable to download sysbench through the system's package manager, speak to try compiling and installing it..."
            if ! wget -O /tmp/sysbench.zip "${cdn_success_url}https://github.com/akopytov/sysbench/archive/1.0.20.zip"; then
                echo "wget failed, trying with curl"
                curl -Lk -o /tmp/sysbench.zip "${cdn_success_url}https://github.com/akopytov/sysbench/archive/1.0.20.zip"
            fi
            if [ ! -f /tmp/sysbench.zip ]; then
                wget -q -O /tmp/sysbench.zip "https://hub.fgit.cf/akopytov/sysbench/archive/1.0.20.zip"
            fi
            chmod +x /tmp/sysbench.zip
            unzip /tmp/sysbench.zip -d /tmp
            Check_SysBench
        fi
    fi
    if ! command -v geekbench >/dev/null 2>&1; then
        _green "Installing geekbench"
        curl -L "${cdn_success_url}https://raw.githubusercontent.com/oneclickvirt/cputest/main/dgb.sh" -o dgb.sh && chmod +x dgb.sh
        bash dgb.sh -v gb5
        _blue "If you not want to use geekbench5, you can use"
        echo "bash dgb.sh -v gb6"
        echo "bash dgb.sh -v gb4"
        _blue "to change version, or use"
        echo "rm -rf /usr/bin/geekbench*"
        _blue "to uninstall geekbench"
        rm -rf dgb.sh
    fi
    if ! command -v speedtest >/dev/null 2>&1; then
        _green "Installing geekbench"
        curl -L "${cdn_success_url}https://raw.githubusercontent.com/oneclickvirt/speedtest/main/dspt.sh" -o dspt.sh && chmod +x dspt.sh
        bash dspt.sh
        rm -rf dspt.sh
        rm -rf speedtest.tar.gz
        _blue "if you want to use golang origin speedtest, you can use"
        echo "rm -rf /usr/bin/speedtest"
        echo "rm -rf /usr/bin/speedtest-go"
        _blue "to uninstall speedtest and speedtest-go"
    fi
    if ! command -v ping >/dev/null 2>&1; then
        _green "Installing ping"
        ${PACKAGE_INSTALL[int]} iputils-ping >/dev/null 2>&1
        ${PACKAGE_INSTALL[int]} ping >/dev/null 2>&1
    fi
    if [ "$(uname -s)" = "Darwin" ]; then
        echo "Detected MacOS. Installing sysbench and fio..."
        brew install --force sysbench fio dd
        # 有问题，需要修复，root环境不能brew，brew安装完毕后可能路径不在环境变量中
    else
        if ! grep -q "^net.ipv4.ping_group_range = 0 2147483647$" /etc/sysctl.conf; then
            echo "net.ipv4.ping_group_range = 0 2147483647" >> /etc/sysctl.conf
            sysctl -p
        fi
    fi
    _green "The environment is ready."
    _green "The next command is: ./goecs.sh install"
}

uninstall_goecs() {
  rm -rf /root/goecs
  rm -rf /usr/bin/goecs
  _green "The command (goecs) has been uninstalled."
}

show_help() {
    cat <<"EOF"
可用命令：

./goecs.sh env            检查并安装的包：
                          sudo  (几乎所有类 Unix 系统都有。)
                          tar   (几乎所有类 Unix 系统都有。)
                          unzip (几乎所有类 Unix 系统都有。)
                          dd    (几乎所有类 Unix 系统都有。)
                          fio   (几乎所有类 Unix 系统可以通过系统的包管理器安装。)
                          sysbench  (几乎所有类 Unix 系统可以通过系统的包管理器安装。)
                          geekbench (geekbench5) (仅支持 IPV4 环境，且内存大于 1GB 并需要持续联网，仅支持 amd64 和 arm64 架构。)
                          speedtest (使用官方提供的二进制文件以获得更准确的测试结果。)
                          ping  (使用官方提供的二进制文件以获得更准确的测试结果。)
                          systemd-detect-virt 或 dmidecode (几乎所有类 Unix 系统都有，安装以获得更准确的测试结果。)
                          事实上，sysbench/geekbench 是上述依赖项中唯一必须安装的，没有它们无法测试 CPU 分数。
./goecs.sh install        安装 goecs 命令
./goecs.sh upgrade        升级 goecs 命令
./goecs.sh uninstall      卸载 goecs 命令
./goecs.sh help           显示此消息

Available commands:

./goecs.sh env             Check and Install package:
                           sudo  (Almost all unix-like systems have it.)
                           tar   (Almost all unix-like systems have it.)
                           unzip (Almost all unix-like systems have it.)
                           dd    (Almost all unix-like systems have it.)
                           fio   (Almost all unix-like systems can be installed through the system's package manager.)
                           sysbench  (Almost all unix-like systems can be installed through the system's package manager.)
                           geekbench (geekbench5)(Only support IPV4 environment, and memory greater than 1GB network detection, only support amd64 and arm64 architecture.)
                           speedtest (Use the officially provided binaries for more accurate test results.)
                           ping   (Use the officially provided binaries for more accurate test results.)
                           systemd-detect-virt OR dmidecode (Almost all unix-like systems have it, for more accurate test results.)
                           In fact, sysbench/geekbench is the only one of the above dependencies that must be installed, without which the CPU score cannot be tested.
./goecs.sh install         Install goecs command
./goecs.sh upgrade         Upgrade goecs command
./goecs.sh uninstall       Uninstall goecs command
./goecs.sh help            Show this message
EOF
}

case "$1" in
"help")
    show_help
    ;;
"env")
    env_check
    ;;
"install" | "upgrade")
    goecs_check
    ;;
"uninstall")
    uninstall_goecs
    ;;
*)
    echo "No command found."
    echo
    show_help
    ;;
esac
